/*!
 * \file Lista.h
 *
 * \date Jan 28, 2014
 * \author correa
 */

#ifndef LISTA_H_
#define LISTA_H_

#include <cassert>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <ValueArray.h>

using namespace std;

class Lista : public vector<int>
{
public:
	Lista(int n);
	Lista(Lista& otra);
	~Lista();

	void operator +=(const int e);
	void operator --();

	int cantidad() const;
	void remove(int i);

	template <class T>
	void crecientePesos(const ValueArray<T>& pesos);

	template <class T>
	void decrecientePesos(const ValueArray<T>& pesos);

	void print();
};

inline Lista::Lista(int n) : vector<int>()
{
	reserve(n);
}

inline Lista::Lista(Lista& otra) : vector<int>(otra)
{
}

inline Lista::~Lista()
{
}

inline void Lista::operator +=(const int e)
{
	push_back(e);
}

inline void Lista::operator --()
{
	pop_back();
}

inline int Lista::cantidad() const
{
	return size();
}

inline void Lista::remove(int i)
{
	(*this)[i] = back();
	pop_back();
}

template <class T>
inline void Lista::crecientePesos(const ValueArray<T>& pesos) {
	struct ComparadorPesosCrecientes {
		ValueArray<T> const * _pesos;
		bool operator() (int a, int b) { return (*_pesos)[a] < (*_pesos)[b]; }
	} _compPesosCrecientes;
	_compPesosCrecientes._pesos = &pesos;
	sort(begin(), end(), _compPesosCrecientes);
}

template <class T>
inline void Lista::decrecientePesos(const ValueArray<T>& pesos) {
	struct ComparadorPesosDecrecientes {
		ValueArray<T> const * _pesos;
		bool operator() (int a, int b) { return (*_pesos)[a] > (*_pesos)[b]; }
	} _compPesosDecrecientes;
	_compPesosDecrecientes._pesos = &pesos;
//	pesos.print();
//	_compPesosDecrecientes._pesos->print();
//	print();
//	cout << "begin=" << *begin() << " end=" << *end() << endl;
//	sort(begin(), end(), _compPesosDecrecientes);
	stable_sort(begin(), end(), _compPesosDecrecientes);
}

inline void Lista::print()
{
	int e;
	cout << "[";
//	for(int i = 0; i < size(); i++)
//	{
//			cout << " " << (*this)[i];
//	}
	for(iterator i = begin(); i != end(); ++i)
	{
			cout << " " << *i;
	}
	cout << " ]" << endl;
}

#endif /* LISTA_H_ */
